package ishanda;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Parameter2JavaBean {
	/**
	 * * 把req中的数据按照对象的属性取出来并set到对象当中并返回 * @param <E> * @param req * @param e * @return
	 * <E>
	 * 
	 * @throws SQLException
	 */
	public static <E> E setParameter2JavaBean(ResultSet rs, E e) throws SQLException {
		Class clazz = e.getClass();
		Field[] fields = clazz.getDeclaredFields();
		for (Field field : fields) {
			Class typeClass = field.getType();
			String value = rs.getString(field.getName());
			if (value != null && !"".equals(value)) {
				setValue(e, clazz, field, typeClass, value);
			}
		}
		return e;
	}

	/**
	 * * 调用set方法把值set到对象当中 * @param obj 指定对象 * @param clazz 对象的class * @param
	 * field 需要设置值的field对象 * @param typeClass field的类型的class * @param value 对应的值
	 */
	private static void setValue(Object obj, Class clazz, Field field, Class typeClass, String value) {
		String fieldName = field.getName();
		String methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
		try {
			Method method = clazz.getDeclaredMethod(methodName, new Class[] { typeClass });
			method.invoke(obj, new Object[] { getClassTypeValue(typeClass, value) });
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}

	/**
	 * * 通过class类型获取获取对应类型的值 * @param typeClass class类型 * @param value 值 * @return
	 * Object
	 */
	private static Object getClassTypeValue(Class typeClass, String value) {
		if (typeClass == int.class) {
			if (value.equals("")) {
				return 0;
			}
			return Integer.parseInt(value);
		} else if (typeClass == short.class) {
			if (value.equals("")) {
				return 0;
			}
			return Short.parseShort(value);
		} else if (typeClass == byte.class) {
			if (value.equals("")) {
				return 0;
			}
			return Byte.parseByte(value);
		} else if (typeClass == double.class) {
			if (value.equals("")) {
				return 0;
			}
			return Double.parseDouble(value);
		} else if (typeClass == boolean.class) {
			if (value.equals("")) {
				return false;
			}
			return Boolean.parseBoolean(value);
		} else if (typeClass == float.class) {
			if (value.equals("")) {
				return 0;
			}
			return Float.parseFloat(value);
		} else if (typeClass == long.class) {
			if (value.equals("")) {
				return 0;
			}
			return Long.parseLong(value);
		} else {
			return typeClass.cast(value);
		}
	}
}